// 一、对象的概念：一组键值对的集合
// 二、对象的特点：
// 1.对象中可以存放多个数据，键值的数据类型没有限制
// 2.对象存储数据的形式是键值对的形式  x=10
// 3.对象中的键名不能重复，键值可以重复
// 4.对象中，值不是函数，叫做属性
// 5.对象中，值是函数，叫做方法

// 三、创建对象
// let obj={};//创建空对象
// console.log(obj);//{}

// let obj={
//     // 键：值
//     // 值不是函数，叫属性
//     name:"小米",
//     age:19,
//     height:180,
//     weight:130,
//     married:false,
//     friends:["小红","小芳"],
//     father:{
//         name:"大米",
//         age:45
//     },
//     // 值是函数，叫方法
//     fn:function(){
//         console.log("坚持就是胜利！");
//     },
//     2:"hello",

// }

// console.log(obj);

// 四、访问对象
// 1.点访问法
// 缺点：（1）无法访问变量  （2）键名是数字的情况无法访问
// console.log(obj.name);
// console.log(obj.friends[1]);
// console.log(obj.father.age);
// let x="age";
// console.log(obj.x);//undefined  对象中访问没有的属性，默认值是undefined，不会报错
// console.log(obj.2);


// 2.中括号访问法
// 优点：（1）可以访问变量  （2）可以访问键名是数字的情况
// console.log(obj["name"]);
// console.log(obj["friends"][1]);
// console.log(obj["father"]["age"]);
// console.log(obj["father"].age);
// let y="height";
// console.log(obj[y]);
// console.log(obj[2]);

// 伪数组对象：本质就是对象，只是访问方式像数组
// arguements={
//     0:"hello",
//     1:"world"
// }


// 3.symbol访问法
// symbol创建的数据永远不会重复，是因为存储空间不同

// 创建一个symbol变量
// let a=Symbol("描述信息：描述变量的用途");
// let b=Symbol("描述信息：描述变量的用途");
// console.log(a==b);//false
// console.log(a===b);//false

// let student={
//     [Symbol("张三")]:67,
//     李四:90,
//     王五:89,
//     [Symbol("张三")]:99
// }
// console.log(student)

// 五、操作对象
// let obj={
//     name:"小米",
//     age:19,
//     fn:function(x){
//         console.log("12345",x);
//         return x;
//     }

// }
// // 1.增
// obj.heigth=190;
// console.log(obj);
// // 2.删
// delete obj.age;//删除键值对  
// console.log(obj);
// // 3.改
// obj.name="小红";
// console.log(obj);
// // 4.查：点访问法和中括号访问法
// console.log(obj.fn("hello"));//obj对象调用fn方法

// 六、对象的常用属性
// 1.in:查看对象中是否包含某个键名;有就返回true，没有就返回false
// let obj={
//     name:"小米"
// }
// console.log("name" in obj);//true
// console.log("age" in obj);//false
// let x="height";
// console.log(x in obj);//false



// 七、遍历对象
// let obj={
//     // 键：值
//     // 值不是函数，叫属性
//     name:"小米",
//     age:19,
//     height:180,
//     weight:130,
//     married:false,
//     friends:["小红","小芳"],
//     father:{
//         name:"大米",
//         age:45
//     },
//     // 值是函数，叫方法
//     fn:function(){
//         console.log("坚持就是胜利！");
//     },
//     2:"hello",

// }
// 1.for-in:遍历对象的键
// i:表示对象的键
// for(let i in obj){
//     console.log(i);//键
//     console.log(obj[i]);//值
// }

// 2.for-of:只能遍历有迭代器的复杂数据类型，但是对象没有迭代器
// i:表示键
// console.log(Object.keys(obj));//['2','name','age','height','weight','married','friends', 'father','fn']
// for(let i of Object.keys(obj)){
//     console.log(i);
// }
// // z:表示值
// for(let z of Object.values(obj)){
//     console.log(z);
// }

// // x:表示键值对
// for(let x of Object.entries(obj)){
//     console.log(x);
// }


// 八、对象的解构：依靠键名赋值
// let [a,b]=[12,34];//数组的解构 依靠位置

// let {age,name}={name:"小米",age:18}
// console.log(name,age);

// let obj={
//     name:"小米"
// }


// function test(obj){
//     console.log(obj.name);
// }

// test(obj);


// 九、this关键字

// 十、字符串的相关属性和方法
// 1.length属性：字符串长度

// 2.slice()方法：截取字符串中的内容

// 3.substr()方法：截取字符串中制定长度的内容
// let str="hello world";
// console.log(str.substr(2,7));//llo wor
// 2:表示起始位置的下标   7：表示截取的长度

// 4.search()方法：搜索字符串中是否包含某个子字符串，如果有就返回下标，没有就返回-1
// let str="this is an apple";
// console.log(str.search("is"));//2
// console.log(str.search("IS"));//-1
// console.log(str.search("an"));//8

// 5.trim()方法：去除字符串的前后空格,中间的空格无法去掉
// let str="   hello  world    ";
// console.log(str.length);//19
// console.log(str.trim().length);//12

// 6.toUpperCase():小写字母转大写   toLowerCase()：大写字母转小写字母
// let str="hEllo";
// console.log(str.toUpperCase());//HELLO
// let str1="hELLo";
// console.log(str.toLowerCase());//hello

// 练习1：输入一个字符串，输出该字符串中重复次数最多的字符
// str="asdaaasdfdg";
// 对象
// let obj={
//     "a":4,
//     "s":2,
//     "d":3,
//     "f":1,
//     "g":1
// }
// function test(str) {
//     let obj = {};
//     for(let i=0;i<str.length;i++){
//         if(str[i] in obj){
//             obj[str[i]]++;//obj["a"]
//         }else{
//             obj[str[i]]=1;
//         }

//     }
//     // 遍历对象的值，找出最大值
//     let max=0;//最大值
//     for(let z of Object.values(obj)){
//         if(z>max){
//             max=z;
//         }
//     }
//     // 再次遍历对象，哪一个属性的值等于max，就是重复次数最大的字符
//     let newObj={};
//     for(let i in obj){
//         if(obj[i]==max){
//             newObj[i]=max;
//         }
//     }

//     return newObj;


// }

// console.log(test("sadhgdassssssaaaaa"));

// 练习2：对这个对象数组进行排序，首先按照年龄来排序，年龄小的在前面， 如果年龄相同 分数低的排在前面
// 如果分数也相同，则学号低的排在前面
let arr = [
    {id:1,name:'张三',age:20,score:87},
    {id:2,name:'李四',age:18,score:77},
    {id:3,name:'王五',age:23,score:65},
    {id:4,name:'赵六',age:27,score:87},
    {id:5,name:'田七',age:23,score:82},
    {id:6,name:'王八',age:25,score:74},
    {id:7,name:'六九',age:19,score:91},
    {id:8,name:'小明',age:18,score:92},
    {id:9,name:'小红',age:20,score:78},
    {id:10,name:'小李',age:27,score:87},
    {id:11,name:'牛牛',age:23,score:65},
    {id:12,name:'妞妞',age:18,score:82},
];

// 方法一：选择排序
// for (let i = 0; i < arr.length; i++) {
//     for (let j = i + 1; j < arr.length; j++) {
//         if (arr[i].age > arr[j].age) {
//             [arr[i], arr[j]] = [arr[j], arr[i]];
//         } else if (arr[i].age == arr[j].age) {
//             if (arr[i].score > arr[j].score) {
//                 [arr[i], arr[j]] = [arr[j], arr[i]];

//             } else if (arr[i].score == arr[j].score) {
//                 if (arr[i].id > arr[j].id) {
//                     [arr[i], arr[j]] = [arr[j], arr[i]];
//                 }
//             }
//         }
//     }
// }

// console.log(arr);


// 方法二：sort
// a：表示数组中的前一个值  b:表示数组中后一个值
arr.sort(function(a,b){
    if(a.age==b.age){
        if(a.score==b.score){
            return a.id-b.id;
        }else{
            return a.score-b.score;
        }
    }else{
       return  a.age-b.age;
    }
})
console.log(arr);